home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / wais / x / util.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  9KB  |  429 lines

  1. /* WIDE AREA INFORMATION SERVER SOFTWARE:
  2.    No guarantees or restrictions.  See the readme file for the full standard
  3.    disclaimer.
  4.  
  5.    This is part of the X user-interface for the WAIS software.  Do with it
  6.    as you please.
  7.  
  8.    Version 0.82
  9.    Wed Apr 24 1991
  10.  
  11.    jonathan@Think.COM
  12.  
  13. */
  14.  
  15. #define _C_UTIL
  16.  
  17. #define XWAIS
  18. #include "xwais.h"
  19.  
  20. int get_selected_item(w)
  21. Widget w;
  22. {
  23.   XawListReturnStruct *selected;
  24.  
  25.   if((selected = XawListShowCurrent(w)) == NULL)
  26.     return NO_ITEM_SELECTED;
  27.   else return selected->list_index;
  28. }
  29.  
  30. int listlength(list)
  31. List list;
  32. {
  33.   int num;
  34.   List l;
  35.  
  36.   for(num = 0, l = list; l != NULL; num++, l = l->nextNode);
  37.  
  38.   return num;
  39. }
  40.  
  41. int charlistlength(list)
  42. char **list;
  43. {
  44.   int num;
  45.  
  46.   if(list) {
  47.     for(num = 0; list[num] != NULL; num++);
  48.     return num;
  49.   }
  50.   else 
  51.     return 0;
  52. }
  53.  
  54. void
  55. PrintStatusW(str, w)
  56. char * str;
  57. Widget w;
  58. {
  59.   XawTextBlock text;
  60.   static XawTextPosition pos = 0;
  61.  
  62.   if(w == NULL)
  63.     fprintf(stderr, "Couldn't display status, invalid window.\n%s", str);
  64.   else {
  65.     text.length = strlen(str);
  66.     text.ptr = str;
  67.     text.firstPos = 0;
  68.     text.format = FMT8BIT;
  69.  
  70.     XawTextReplace(w, pos, pos, &text);
  71.  
  72.     pos += text.length;
  73.     XawTextSetInsertionPoint(w, pos);
  74.     XSync(XtDisplay(w), False);
  75.   }
  76. }
  77.  
  78. void PrintStatus(str)
  79. char *str;
  80. {
  81.   PrintStatusW(str, messwidget);
  82. }
  83.  
  84. void
  85. XwaisPrintf(str)
  86. char * str;
  87. {
  88.   PrintStatusW(str, messwidget);
  89. }
  90.  
  91. void
  92. ReplaceText(w, str)
  93. Widget w;
  94. char * str;
  95. {
  96.   Arg args[1];
  97.   Cardinal numargs;
  98.  
  99.   numargs = 0;
  100.   XtSetArg(args[numargs], XtNstring, str); numargs++;
  101.   XtSetValues(w, args, numargs);
  102. }
  103.  
  104.  
  105. Widget
  106. MakeCommandButton(box, name, function, vlink, hlink, data)
  107. Widget box, vlink, hlink;
  108. char *name;
  109. XtCallbackProc function;
  110. caddr_t data;
  111. {
  112.   Widget w;
  113.   Arg args[10];
  114.   Cardinal numargs;
  115.  
  116.   numargs = 0;
  117.   if(vlink != NULL) {
  118.     XtSetArg(args[numargs], XtNfromVert, vlink); numargs++;
  119.   }
  120.   if(hlink != NULL) {
  121.     XtSetArg(args[numargs], XtNfromHoriz, hlink); numargs++;
  122.   }
  123.   w = XtCreateManagedWidget(name, commandWidgetClass, box, args, numargs);
  124.   if (function != NULL)
  125.     XtAddCallback(w, XtNcallback, function, data);
  126.   return w;
  127. }
  128.  
  129. Widget
  130. MakeListWidget(parent, name, list, callback, vlink, hlink)
  131. Widget parent, vlink, hlink;
  132. String name;
  133. char **list;
  134. XtCallbackProc callback;
  135. {
  136.   Arg args[10];
  137.   Cardinal numargs;
  138.   Widget ListW;
  139.  
  140.   numargs = 0;
  141.   if (vlink != NULL) {
  142.     XtSetArg(args[numargs], XtNfromVert, vlink); numargs++;
  143.   }
  144.   if (hlink != NULL) {
  145.     XtSetArg(args[numargs], XtNfromHoriz, hlink); numargs++;
  146.   }
  147.   XtSetArg(args[numargs], XtNhorizDistance, 0); numargs++;
  148.   XtSetArg(args[numargs], XtNlist, list); numargs++;
  149.   XtSetArg(args[numargs], XtNforceColumns, True); numargs++;
  150.   XtSetArg(args[numargs], XtNdefaultColumns, 1); numargs++;
  151.   ListW = XtCreateManagedWidget(name, listWidgetClass,
  152.                 parent, args, numargs);
  153.  
  154.   if (callback != NULL) XtAddCallback(ListW, XtNcallback, callback, NULL);
  155.  
  156.   return ListW;
  157. }  
  158.  
  159. void RebuildListWidget(s, list)
  160. ScrollList s;
  161. String *list;
  162. {
  163.   String t[1];
  164.   Widget p = XtParent(s->ListWidget);
  165.  
  166.   t[0] = NULL;
  167.   XtDestroyWidget(s->ListWidget);
  168.   s->ListWidget = MakeListWidget(p, s->name, t, s->callback, NULL, NULL);
  169.   if (list != NULL) XawListChange(s->ListWidget, list, 0, 0, True);
  170. }
  171.  
  172. ScrollList
  173. MakeScrollList(parent, name, items, callback, vlink, hlink)
  174. Widget parent, vlink, hlink;
  175. XtCallbackProc callback;
  176. String name, *items;
  177. {
  178.   Arg arglist[10];
  179.   Cardinal num_args;
  180.   static char names[STRINGSIZE];
  181.   ScrollList result;
  182.  
  183.   result = (ScrollList) s_malloc(sizeof(_ScrollList));
  184.  
  185.   result->name = s_strdup(name);
  186.   result->callback = callback;
  187.  
  188.   num_args = 0;
  189.   if(vlink != NULL) {
  190.     XtSetArg(arglist[num_args], XtNfromVert, vlink); num_args++;
  191.   }
  192.   if(hlink != NULL) {
  193.     XtSetArg(arglist[num_args], XtNfromHoriz, hlink); num_args++;
  194.   }
  195.   XtSetArg(arglist[num_args], XtNorientation, XtorientVertical); num_args++;
  196.   result->ListWidget = MakeListWidget(parent, name, items, 
  197.                       callback, vlink, NULL);
  198.  
  199.   return(result);
  200. }
  201.  
  202. Widget 
  203. MakeStringBox(parent, name, string, vlink, hlink)
  204. Widget parent, vlink, hlink;
  205. String name, string;
  206. {
  207.   Arg args[5];
  208.   Cardinal numargs = 0;
  209.   Widget StringW;
  210.  
  211.   XtSetArg(args[numargs], XtNeditType, XawtextEdit); numargs++;
  212.   XtSetArg(args[numargs], XtNstring, string); numargs++;
  213.   if(vlink != NULL) {
  214.     XtSetArg(args[numargs], XtNfromVert, vlink); numargs++;
  215.   }
  216.   if(hlink != NULL) {
  217.     XtSetArg(args[numargs], XtNfromHoriz, hlink); numargs++;
  218.   }
  219.  
  220.   StringW = XtCreateManagedWidget(name, asciiTextWidgetClass, 
  221.                   parent, args, numargs);
  222.   return(StringW);  
  223. }
  224.  
  225. /*    Function Name: GetString
  226.  *    Description: retrieves the string from a asciiText widget.
  227.  *    Arguments: w - the ascii text widget.
  228.  *    Returns: the filename.
  229.  */
  230.  
  231. String
  232. GetString(w)
  233. Widget w;
  234. {
  235.   String str;
  236.   Arg args[1];
  237.   
  238.   XtSetArg(args[0], XtNstring, &str);
  239.   XtGetValues( w, args, ONE);
  240.   return(str);
  241. }
  242.  
  243. Widget MakeLabel(parent, name, label, vlink, hlink)
  244. Widget parent, vlink, hlink;
  245. char *name, *label;
  246. {
  247.   Arg args[5];
  248.   Cardinal numargs;
  249.   Widget labelwid;
  250.  
  251.   numargs = 0;
  252.   XtSetArg(args[numargs], XtNlabel, label); numargs++;
  253.   if(vlink != NULL) {
  254.     XtSetArg(args[numargs], XtNfromVert, vlink); numargs++;
  255.   }
  256.   if(hlink != NULL) {
  257.     XtSetArg(args[numargs], XtNfromHoriz, hlink); numargs++;
  258.   }
  259.   XtSetArg(args[numargs], XtNborderWidth, 0); numargs++;
  260.   labelwid = XtCreateManagedWidget(name,labelWidgetClass, 
  261.                    parent, args, numargs);
  262.   return(labelwid);
  263. }
  264.  
  265. #define BEFORE 1
  266. #define DURING 2
  267. #define QUOTE 5
  268.  
  269. /* ripped out of gmacs-ui.c */
  270. int find_string_slot(source, key, value, value_size, delete_internal_quotes)
  271. char *source, *key, *value;
  272. long value_size;
  273. boolean delete_internal_quotes;
  274. {
  275.   char ch;
  276.   short state = BEFORE;
  277.   long position = 0;  /* position in value */
  278.   char *pos =strstr(source, key); /* address into source */
  279.  
  280.   value[0] = '\0';        /* initialize to nothing */
  281.  
  282.   if(NULL == pos)
  283.     return(1);
  284.  
  285.   for(pos = pos + strlen(key); pos < source + strlen(source); pos++){
  286.     ch = *pos;
  287.     if((state == BEFORE) && (ch == '\"'))
  288.       state = DURING;
  289.     else if ((state == DURING) && (ch == '\\')){
  290.       state = QUOTE;    
  291.       if(!delete_internal_quotes){
  292.     value[position] = ch;
  293.     position++;
  294.     if(position >= value_size){
  295.       value[value_size - 1] = '\0';
  296.       return(-1);
  297.     }
  298.       }
  299.     }
  300.     else if ((state == DURING) && (ch == '"')){    
  301.       value[position] = '\0';
  302.       return(0);
  303.     }
  304.     else if ((state == QUOTE) || (state == DURING)){
  305.       if(state ==  QUOTE)
  306.     state = DURING;
  307.       value[position] = ch;
  308.       position++;
  309.       if(position >= value_size){
  310.     value[value_size - 1] = '\0';
  311.     return(-1);
  312.       }
  313.     }
  314.     /* otherwise we are still before the start of the value */
  315.   }
  316.   value[position] = '\0';
  317.   return(-1); /* error because we are in the middle of the string */
  318. }
  319.  
  320. void find_value(source, key, value, value_size)
  321. char *source, *key, *value;
  322. int value_size;
  323. {
  324.   char ch;
  325.   long position = 0;  /* position in value */
  326.   char *pos =strstr(source, key); /* address into source */
  327.  
  328.   value[0] = '\0';        /* initialize to nothing */
  329.  
  330.   if(NULL == pos)
  331.     return;
  332.  
  333.   pos = pos + strlen(key);
  334.   ch = *pos;
  335.   /* skip leading quotes and spaces */
  336.   while((ch == '\"') || (ch == ' ')) {
  337.     pos++; ch = *pos;
  338.   }
  339.   for(position = 0; pos < source + strlen(source); pos++){
  340.     if((ch = *pos) == ' ') {
  341.       value[position] = '\0';
  342.       return;
  343.     }
  344.     value[position] = ch;
  345.     position++;
  346.     if(position >= value_size){
  347.       value[value_size - 1] = '\0';
  348.       return;
  349.     }
  350.   }
  351.   value[position] = '\0';
  352. }
  353.  
  354. void SortSources()
  355. {
  356.   Boolean Changed = TRUE;
  357.   Source s;
  358.   SList sl;
  359.  
  360.   while(Changed) {
  361.     Changed = FALSE;
  362.     for(sl = Sources; sl->nextSource != NULL; sl = sl->nextSource) {
  363.       if(sl->nextSource->thisSource->name == NULL) {
  364.     Changed = TRUE;
  365.     sl->nextSource = sl->nextSource->nextSource;
  366.       }
  367.       else
  368.     if(0 < strcmp(sl->thisSource->name, sl->nextSource->thisSource->name)) {
  369.       Changed = TRUE;
  370.       s = sl->thisSource;
  371.       sl->thisSource = sl->nextSource->thisSource;
  372.       sl->nextSource->thisSource = s;
  373.     }
  374.     }
  375.   }
  376. }
  377.  
  378. char *
  379. get_filename(name)
  380. char* name;
  381. {
  382.   char *result, *loc;
  383.   long i;
  384.  
  385.   loc = strchr(name,' ');
  386.   if (loc == NULL) return name;
  387.  
  388.   i = (long)loc - (long)name;
  389.   
  390.   result = s_malloc(i+1);
  391.   strncpy(result, name, i);
  392.   result[i] = 0;
  393.   return result;
  394. }
  395.  
  396. void
  397. Feep()
  398. {
  399.   if (CurDpy != NULL)
  400.     XBell(CurDpy, 0);
  401. }
  402.  
  403. extern int alphasort();
  404.  
  405. char **
  406. GetDirNames(directory)
  407. char *directory;
  408. {
  409.   char **result;
  410.   struct dirent **list;
  411.   int i, j;
  412.  
  413.   if ((j = scandir(directory, &list, NULL, alphasort)) < 0) {
  414.       char booboo[STRINGSIZE];
  415.       sprintf(booboo, "Error on open of source directory: %s.\n", directory);
  416.       PrintStatus(booboo);
  417.       return NULL;
  418.     }
  419.  
  420.   result = (char**) s_malloc((j+1) * sizeof(char*));
  421.  
  422.   for (i = 0; i < j; i++) {
  423.     result[i] = s_strdup(list[i]->d_name);
  424.     s_free(list[i]);
  425.   }
  426.   s_free(list);
  427.   return result;
  428. }
  429.